package cn.coldleaf.wiki.services.impl;

import cn.coldleaf.wiki.mappers.SpaceMapper;
import cn.coldleaf.wiki.pojo.dto.SpaceQueryDto;
import cn.coldleaf.wiki.pojo.dto.SpaceSaveDto;
import cn.coldleaf.wiki.pojo.entity.BaseEntity;
import cn.coldleaf.wiki.pojo.entity.SpaceEntity;
import cn.coldleaf.wiki.pojo.vo.SpaceVo;
import cn.coldleaf.wiki.services.SpaceService;
import cn.coldleaf.wiki.utils.StringUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @datetime 2023/10/20 上午11:17
 * @user cold
 **/
@Service
@AllArgsConstructor
public class SpaceServiceImpl implements SpaceService {
    private final SpaceMapper spaceMapper;
    /**
     * 创建空间
     *
     * @param dto
     * @datetime 2023-10-20 11:14:36
     * @user cold
     */
    @Override
    public int saveSpace(SpaceSaveDto dto) {
        SpaceEntity entity = new SpaceEntity();
        entity.setName(dto.getName());
        entity.setUserId(dto.getOperator());
        entity.setAddUser(dto.getOperator());
        entity.setUpdateUser(dto.getOperator());
        return spaceMapper.insert(entity);
    }

    /**
     * 修改空间
     *
     * @param dto
     * @datetime 2023-10-20 11:15:04
     * @user cold
     */
    @Override
    public int modifySpace(SpaceSaveDto dto) {
        SpaceEntity space = spaceMapper.selectById(dto.getId());
        if (space == null){
            return 0;
        }
        boolean isUpdate = false;
        SpaceEntity update = new SpaceEntity();
        if (dto.getName() != null && !StringUtil.equals(dto.getName(),space.getName())){
            update.setName(dto.getName());
            isUpdate = true;
        }
        if (isUpdate){
            update.setId(dto.getId());
            update.setUpdateUser(dto.getOperator());
            return spaceMapper.updateById(update);
        }
        return 0;
    }

    /**
     * 删除空间
     *
     * @param dto
     * @datetime 2023-10-20 11:15:38
     * @user cold
     */
    @Override
    public int removeSpace(SpaceSaveDto dto) {
        return spaceMapper.deleteById(dto.getId());
    }

    /**
     * 获取空间列表
     *
     * @param dto
     * @datetime 2023-10-20 11:16:17
     * @user cold
     */
    @Override
    public List<SpaceVo> searchList(SpaceQueryDto dto) {
        LambdaQueryWrapper<SpaceEntity> queryWrapper = new QueryWrapper<SpaceEntity>().lambda();
        if (dto.getId() != null){
            queryWrapper.eq(BaseEntity::getId,dto.getId());
        }
        if (dto.getName() != null){
            queryWrapper.like(SpaceEntity::getName,dto.getName());
        }
        List<SpaceEntity> spaceList = spaceMapper.selectList(queryWrapper);
        List<SpaceVo> vos = new ArrayList<>();
        for (SpaceEntity entity : spaceList) {
            SpaceVo vo = new SpaceVo();
            BeanUtils.copyProperties(entity,vo);
            vos.add(vo);
        }
        return vos;
    }

    /**
     * 获取指定空间
     *
     * @param dto
     * @datetime 2023-10-20 11:16:46
     * @user cold
     */
    @Override
    public SpaceVo getSpace(SpaceQueryDto dto) {
        SpaceEntity entity = spaceMapper.selectById(dto.getId());
        if (entity != null){
            SpaceVo vo = new SpaceVo();
            BeanUtils.copyProperties(entity,vo);
            return vo;
        }
        return null;
    }
}
